perm filename PLAY.FAI[MUS,SYS] blob sn#170430 filedate 1975-07-30 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	SOUND  DOROTHY BENDER ****** 1969, 1975(LCS)*******
C00011 ENDMK
C⊗;
	TITLE	SOUND;  DOROTHY BENDER ****** 1969, 1975(LCS)*******

;  ROUTINE TO READ THE OUTPUT FROM THE MUSIC
;  PROGRAM AND CALL THE D-A CONVERTER TO PLAY.
;  
;  NAME OF THE FILE TO BE INPUTTED IS 'MUSIC.MUS' OR 'MUSAA.DMD',
;  THE FIRST RECORD OF WHICH CONTAINS THE
;  NUMBER OF WORDS OF DATA IN THE ENTIRE DISK FILE.

A   ←   1     ;WORK
B   ←   2     ;WORK
RET ←   3     ;RETURN ACCUMULATOR
T1  ←   4     ; TEMP FOR ADSMAP (JAM)
;;BUFSIZ ←=20224   ;****** DOUBLE THIS FOR 4-CHANNEL SOUND!!!!!	
BUFSIZ ←4400*3	;OPTIMIZED FOR 3330 DSK. (←4400*3 IN SYS VERSION)
↓DSKCHN ←1             ;DISK CHANNEL FOR INPUT
↓ADCHN  ←2             ;D-A CHANNEL FOR OUTPUT

	OPDEF	READCH [51B8]
        OPDEF   MESSAGE[51B8!3B12]

BEG:	CALLI	0,0         ;RESET I/O DEVICES
 	OPEN 	DSKCHN,[17  ;MODE
		'DSK   '    ;DEVICE NAME
 		0]          ;NO BUFFER HEADERS
	HALT	BEG         ;RESTART IF DEVICE IS UNAVAILABLE

	MOVE 6,['MUSAA ']
	MOVE 7,['DMD   ']
 	SETZM	DIR2+3    ;FOR RESTART
 	SETZM	DIR+3    ;FOR RESTART
	OUTSTR[ASCIZ/FILE NAME -- /]  ;READS '.DMD' FILES ONLY.
	SETZM DIR+1
	SETZM DIR
	SETO 5,		;FLAG FOR EXTENSIONS
	MOVE  2,[POINT 6,DIR]
	JRST GOT
EXT:	MOVE 2,[POINT 6,DIR+1]
	SETZ 5,
GOT:	INCHWL	1
	CAIN  1,15	; A CR?
	JRST  GOT
	CAIGE	1,60		; CHECKS FOR GOOD CHARS.
	JRST	LX  
	SUBI	1,40
	IDPB	1,2
	JRST	GOT
LX:	JUMPE 5,LZ
	SKIPN DIR
	MOVEM 6,DIR
	CAIN  1,56 	; 56='.'
	JRST EXT
	JRST MESS
LZ:	SKIPN DIR+1
	MOVEM 7,DIR+1
	;FIND OUT NUMBER OF CHANNELS AND THE SPEED.
MESS:	MESSAGE	[ASCIZ/  HOW MANY CHANNELS? /]
	READCH	A
	SUBI	A,"0"+1		;CONVERT TO BINR AND ADD 1
	DPB	A,[POINT 2,OUTBIT,26]

SPD:	MESSAGE [ASCIZ/  SPEED? /]
	READCH  A
	CAIG A,65		;IS IT 1 - 5?
	JRST SPD2		;YES
	SKIPN DIR+3		;IS THIS THE 1ST TIME THRU?
	JRST SPD		;YES, SO WE NEED A GOOD NUM.
	JRST PLA2 		;ANYTHING ELSE WILL REPLAY
SPD2:	SUBI	A,"0"
	DPB	A,[POINT 3,OUTBIT,32]

PLA2:	SETZM DIR+3
	SETZM DIR2+3
	MOVE 5,DMD		;GET 'DMD   '
	LOOKUP	DSKCHN,DIR   
	SKIPA			;CAN'T FIND MUSAA.DMD
	JRST XOPEN		;FOUND IT
	CAMN 5,DIR+1		;IS DIR+1='DMD   '?
	JRST MUS		;YES, GO LOOK FOR MUSIC.MUS
	MOVEM 5,DIR+1
	JRST PLA2		;TRY IT WITH 'DMD   '
MUS:	LOOKUP  DSKCHN,DIR2	;TRY FOR MUSIC.MUS

	JRST	[MESSAGE[ASCIZ/
		*** MUSIC FILE NOT FOUND/]
		CALLI  12]
        ;EXIT IF FILE IS MISSING
	MOVE A,DIR2+3	;GET LENGTH OF MUSIC.MUS
	MOVEM A,DIR+3;PUT IT IN RIGHT PLACE

XOPEN:	OPEN	ADCHN,[117 	;MODE
         	'AD    '        ;DEVICE NAME
 		0]              ;NO BUFFER HEADERS

  	JRST	[MESSAGE[ASCIZ/
		***D-A NOT AVAILABLE/]
		CALLI  12]
	;EXIT IF D-A IS UNAVAILABLE

XGPOK:	MOVSI	'XGP'	;DOWN TO SPWAR FOR XGP CONFLICT.
	DEVUSE	0,	
	HLRZ 	0,0
	CAIN	400000
	JRST	SPWAR
	INIT	16,17
	SIXBIT	.XGP.
	0
	JRA	16,2(16)
SPWAR:	LOCK A,
;;	SPCWAR 17,[CALLI]
	MESSAGE [ASCIZ/ GO? /]
	READCH A


LNTH:	movs a,DIR+3		;get length of file.
	movnm a,nwd
;-----------------------------------------------------

	;BEGIN MAIN BODY OF PROGRAM

	MOVE T1,[647004,,0]
	ADSMAP T1,	; SET AUDIO SWITCH TEMPORARILY TO DAC (JAM 7/24/75)
			; THE OPTIONS WE ASKED FOR ARE TEMPORARY, WAIT FOR
			; PAGE TO FINISH, DON'T INTERRUPT WITH MORE PAGES,
			; DELAY BEEPS TO END OF XFR.
	OUTSTR [ASCIZ /
TO DAC . . ./]
LOOP:	JSP	RET,SUB		;ROUTINE TO READ AND WRITE
	BUF1-1 			;USE BUF1 FOR THE I/O
	JUMPLE	B,OUT    	;DONE
	
	JSP	RET,SUB		;CALL IT AGAIN
	BUF2-1			;USE BUF2 FOR THE I/O
	JUMPG	B,LOOP		;GO BACK FOR MORE IF B>0

OUT:	close dskchn,		;END OF PROGRAM.
	releas adchn,
	OUTSTR [ASCIZ / DONE!
/]
	SETO T1,
	ADSMAP T1,	; RESET AUDIO SWITCH CONNECTION TO PERMANENT (JAM 7/24/75)
;;	SPCWAR 0,'SSW'
	UNLOCK
	RELEASE 16,
	jrst SPD

	;SUBROUTINE TO SET UP IOWD AND READ AND WRITE.
	;  1(RET) WILL BE THE RETURN
	;  0(RET) WILL BE THE ADDRESS OF THE BUFFER TO BE
	;         PUT IN THE RIGHT HALF OF THE IOWD.
	;  A      WILL BE A WORK REGISTER
    	;  B      WILL BE TESTED ON THE OUTSIDE.

SUB:	MOVNI	A,BUFSIZ	;PICK UP AND COMPLEMENT BUFSIZ
	ADDB	A,NWD		;A←NWD-BUFSIZ
				;NWD←NWD-BUFSIZ
	MOVE	B,A		;SAVE B TO BE TESTED FOR LAST
				;TIME.
	JUMPL	A,LAST		;SET UP FOR LAST TIME.
	MOVEI	A,0		

	;THE IOWD LOOKS LIKE:
	;  [-BUFSIZ / BUFI-1]

LAST:	ADDI	A,BUFSIZ
	MOVNS	A		;COMPLEMENT A
	HRL	A,0(RET)	;PICK UP BUFI AND MOVE IT
				;TO THE LEFT SIDE OF A.
	MOVSM	A,INLIST	;SWAP A AND MOVE IT.
	MOVSM	A,OUTWC		;SAME FOR OUTPUT.
	INPUT	DSKCHN,INLIST	;READ A RECORD.
	OUTPUT	ADCHN,OUTWC	;WRITE THE RECORD.
	JRST	1(RET)		;RETURN
;---------------------------------------------------------

; STORAGE:

NWD:	0			;FOR NUMBER OF WORDS OF INPUT.
↓BUF1:	BLOCK	BUFSIZ+1	;BUFFER 1
BUF2:	BLOCK	BUFSIZ+1	;BUFFER 2

DMD:	'DMD   '
DIR2: 'MUSIC '		;FILENAME FOR INPUT
	'MUS   '			;EXTENSION
	0			;INFORMATION ON FILE
	0			;PROJECT PROG#
DIR:	0    			;NAME
	0			;EXTENSION
	0			;INFORMATION ON FILE
	0			;PROJECT PROG#
CLIST:	IOWD	1,NWD		;FOR THE FIRST RECORD
	0
INLIST:	0			;WILL CONTAIN AN IOWD
	0
OUTWC:	0			;WILL CONTAIN AN IOWD FOR D-A
	3650			;MAGIC BITS FOR 136.
OUTBIT: 4000			;BITS FOR D-A
	BLOCK	2


A←1
B←2
D←3

ichn←adchn

END BEG